package com.team6.yygh.msm.service.impl;

import com.team6.yygh.msm.service.MsmService;
import com.team6.yygh.msm.utils.ConstantPropertiesUtils;
import com.team6.yygh.vo.msm.MsmVo;
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile;
import com.tencentcloudapi.sms.v20210111.SmsClient;
import com.tencentcloudapi.sms.v20210111.models.SendSmsRequest;
import com.tencentcloudapi.sms.v20210111.models.SendSmsResponse;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.Map;

/**
 * @ClassName MsmServiceImpl
 * @Author ZhuYouWan
 * @Date 2022/10/24 13:40
 **/
@Service
public class MsmServiceImpl implements MsmService {
    /**
     * 发送手机验证码
     */
    @Override
    public boolean send(String phone, String code) {
        // 判断手机号是否为空
        if (StringUtils.isEmpty(phone)){
            return false;
        }
        // 整合腾讯云短信服务
        // 设置相关参数
        // 实例化一个认证对象，入参需要传入腾讯云账户secretId，secretKey,此处还需注意密钥对的保密
        Credential cred = new Credential(ConstantPropertiesUtils.SECRET_ID, ConstantPropertiesUtils.SECRET_KEY);
        // 实例化一个http选项，可选的，没有特殊需求可以跳过
        HttpProfile httpProfile = new HttpProfile();
        httpProfile.setEndpoint("sms.tencentcloudapi.com");
        // 实例化一个client选项，可选的，没有特殊需求可以跳过
        ClientProfile clientProfile = new ClientProfile();
        clientProfile.setHttpProfile(httpProfile);
        // 实例化要请求产品的client对象,clientProfile是可选的  第二个参数是地域信息
        SmsClient client = new SmsClient(cred, "ap-guangzhou", clientProfile);
        // 实例化一个请求对象,每个接口都会对应一个request对象
        SendSmsRequest req = new SendSmsRequest();
        // 设置固定的参数
        // 短信应用ID: 短信SdkAppId在 [短信控制台] 添加应用后生成的实际SdkAppId
        req.setSmsSdkAppId(ConstantPropertiesUtils.SMSSDKAPP_ID);
        // 短信签名内容: 使用 UTF-8 编码，必须填写已审核通过的签名
        req.setSignName(ConstantPropertiesUtils.SIGN_NAME);
        // 模板 ID: 必须填写已审核通过的模板 ID
        req.setTemplateId(ConstantPropertiesUtils.TEMPLATE_ID);
        // 发送的手机号
        String[] phoneNumber = {"+86" + phone};
        req.setPhoneNumberSet(phoneNumber);
        // 发送的验证码 模板的参数 第一个是验证码，第二个是过期时间
        String[] paramCode = {code};
        req.setTemplateParamSet(paramCode);
        try {
            // 发送短信
            // 返回的resp是一个SendSmsResponse的实例，与请求对象对应
            SendSmsResponse resp = client.SendSms(req);
            return true;
        } catch (TencentCloudSDKException e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * mq专属发送短信
     */
    @Override
    public boolean send(MsmVo msmVo) {
        if (!StringUtils.isEmpty(msmVo.getPhone())) {
            boolean isSend = this.send(msmVo.getPhone(), msmVo.getParam());
            return isSend;
        }
        return false;
    }

    private boolean send(String phone, Map<String,Object> param) {
        // 判断手机号是否为空
        if (StringUtils.isEmpty(phone)){
            return false;
        }
        // 整合腾讯云短信服务
        // 设置相关参数
        // 实例化一个认证对象，入参需要传入腾讯云账户secretId，secretKey,此处还需注意密钥对的保密
        Credential cred = new Credential(ConstantPropertiesUtils.SECRET_ID, ConstantPropertiesUtils.SECRET_KEY);
        // 实例化一个http选项，可选的，没有特殊需求可以跳过
        HttpProfile httpProfile = new HttpProfile();
        httpProfile.setEndpoint("sms.tencentcloudapi.com");
        // 实例化一个client选项，可选的，没有特殊需求可以跳过
        ClientProfile clientProfile = new ClientProfile();
        clientProfile.setHttpProfile(httpProfile);
        // 实例化要请求产品的client对象,clientProfile是可选的  第二个参数是地域信息
        SmsClient client = new SmsClient(cred, "ap-guangzhou", clientProfile);
        // 实例化一个请求对象,每个接口都会对应一个request对象
        SendSmsRequest req = new SendSmsRequest();
        // 设置固定的参数
        // 短信应用ID: 短信SdkAppId在 [短信控制台] 添加应用后生成的实际SdkAppId
        req.setSmsSdkAppId(ConstantPropertiesUtils.SMSSDKAPP_ID);
        // 短信签名内容: 使用 UTF-8 编码，必须填写已审核通过的签名
        req.setSignName(ConstantPropertiesUtils.SIGN_NAME);
        // 模板 ID: 必须填写已审核通过的模板 ID
        req.setTemplateId(ConstantPropertiesUtils.TEMPLATE_ID);
        // 发送的手机号
        String[] phoneNumber = {"+86" + phone};
        req.setPhoneNumberSet(phoneNumber);
        // 发送的验证码 模板的参数 第一个是验证码，第二个是过期时间
        String[] paramCode = {param.toString()};
        req.setTemplateParamSet(paramCode);
        try {
            // 发送短信
            // 返回的resp是一个SendSmsResponse的实例，与请求对象对应
            SendSmsResponse resp = client.SendSms(req);
            return true;
        } catch (TencentCloudSDKException e) {
            e.printStackTrace();
            return false;
        }
    }
}
